home *** CD-ROM | disk | FTP | other *** search
-
- #undef NSYMS
- #define NSYMS(hdr) count_symbols(&hdr,fp)
- #ifndef dprintf
- #define dprintf(a,b)
- #endif
-
- /* the routines other than relocate are also used in rsym.c */
-
-
- #ifdef IN_RSYM
- #define temp_malloc malloc
- #else
-
- relocate()
- {
- char *where;
- {
- unsigned int new_value;
- where = the_start + relocation_info.r_address;
- switch(relocation_info.r_segment){
- case RNOOP: goto DONT;
- case REXT:
- new_value = symbol_table[relocation_info.
- r_symbolnum].n_value;
- break;
- case RDATA:
- case RBSS:
- case RTEXT: new_value= (int)start_address; break;
- default:
- dprintf(relocation_info.r_address = %d,
- relocation_info.r_address);
- printf(
- "\nRel_Info {r_segment = %x, r_symbolnum= %x, r_address = %d} -- Ignored",
- relocation_info.r_segment,
- relocation_info.r_symbolnum,
- relocation_info.r_address);
- fflush(stdout);
- goto DONT;
- };
- switch(relocation_info.r_length){
- case 0: *( char *)where = new_value + *( char *) where;
- break;
- case 1: *( short *)where = new_value + *( short *) where;
- break;
- case 2: *( long *)where = new_value + *( long *) where;
- break;
- }
- DONT: ;
- }
- }
-
-
-
- #ifdef PRIVATE_FASLINK
-
- int
- faslink(faslfile, ldargstring)
- object faslfile, ldargstring;
- {
- struct exec tmpheader, faslheader;
-
- FILE *fp; TABL *table;
- char filename[MAXPATHLEN];
- char ldargstr[MAXPATHLEN];
- char stbfilename[32];
- char tmpfilename[32];
- char command[MAXPATHLEN * 2];
- char buf[BUFSIZ], *p;
- int i, res;
- object tmpfile, data;
- object *old_vs_base = vs_base;
- object *old_vs_top = vs_top;
-
- coerce_to_filename(ldargstring, ldargstr);
- coerce_to_filename(faslfile, filename);
-
- /* Print out symbol table */
- sprintf(stbfilename, "/tmp/stb%d", getpid());
- fp = fopen(stbfilename, "w");
- for(i = 0, p = (char *)&tmpheader; i < sizeof(struct exec); i++)
- *p++ = '\0';
- tmpheader.a_magic.system_id = HP9000S200_ID;
- tmpheader.a_magic.file_type = RELOC_MAGIC;
- tmpheader.a_stamp = 2;
-
- fwrite(&tmpheader, sizeof(struct exec), 1, fp);
- table = c_table.ptable;
- for(i = 0; i < c_table.length; i++) {
- struct nlist_ nbuf; int len;
- char *string; unsigned int address;
- string =(*table)[i].string;
- address =(*table)[i].address;
- len = strlen(string);
- if (((strncmp(string,"_end", 4) == NULL) && (len == 4)) ||
- ((strncmp(string,"_etext",6) == NULL) && (len == 6)) ||
- ((strncmp(string,"_edata",6) == NULL) && (len == 6)))
- continue;
- nbuf.n_value = address;
- nbuf.n_type = N_ABS | N_EXT;
- nbuf.n_length = len;
- nbuf.n_almod = 0;
- nbuf.n_unused = 0;
- fwrite(&nbuf,sizeof(nbuf),1,fp);
- fwrite(string,len,1,fp);
- tmpheader.a_lesyms += sizeof(struct nlist_) + len;
- }
- fseek(fp,0,0);
- fwrite(&tmpheader, sizeof(struct exec), 1, fp);
- fclose(fp);
-
- sprintf(tmpfilename, "/tmp/fasl%d", getpid());
- sprintf(command,
- "ld -r -o %s -x %s %s %s -h _edata -h _etext",
- tmpfilename,
- stbfilename,
- filename,
- ldargstr);
-
- if (system(command) != 0)
- FEerror("The linkage editor failed.", 0);
-
- unlink(stbfilename);
-
- faslfile = open_stream(faslfile, smm_input, Cnil, Kerror);
- vs_push(faslfile);
- fp = faslfile->sm.sm_fp;
- fread(&faslheader, sizeof(faslheader), 1, fp);
- fseek(fp,RDATA_OFFSET(faslheader)+faslheader.a_drsize,0);
-
- { FILE *tmpfp;
- int fpthis,fpend;
- fpthis = ftell(fp);
- fseek(fp,0,2);
- fpend = ftell(fp);
- fseek(fp,fpthis,0);
- tmpfp = fopen(tmpfilename,"a+");
- fseek(tmpfp,0,2);
- filecpy(tmpfp,fp,fpend-fpthis);
- fclose(tmpfp);
- }
-
- close_stream(faslfile, TRUE);
-
- tmpfile = make_simple_string(tmpfilename);
- vs_push(tmpfile);
-
- res = fasload(tmpfile);
-
- unlink(tmpfilename);
- vs_base = old_vs_base;
- vs_top = old_vs_top;
-
- return(res);
- }
- #endif
- #endif
-
-
- count_symbols(phdr,fp)
- struct exec *phdr;
- FILE *fp;
- {int nsyms,i;
- fseek(fp,(int)(LESYM_OFFSET(*phdr)), 0);
- for(i = phdr->a_lesyms, nsyms = 0; i > 0; nsyms++) {
- struct syment tmp;
- fread((char *)&tmp, SYMESZ, 1, fp); i -= SYMESZ;
- fseek(fp,(int)tmp.n_length,1); i -= tmp.n_length;
- }
- return (nsyms);
- }
-
-
- #define READ_IN_STRING_TABLE(fp,size) \
- read_in_string_table(fp,&fileheader,size)
-
- char *
- read_in_string_table(fp,pfileheader,string_size)
- FILE *fp;
- struct exec *pfileheader;
- int string_size ;
-
- {
- char *p,*ans;
- int slen,i,j;
- ans=p = temp_malloc((unsigned int)string_size);
- dprintf( string table leng = %d, string_size);
- fseek(fp,LESYM_OFFSET(*pfileheader), 0);
- for (i = pfileheader->a_lesyms,j=0; i > 0; i=i- slen-SYMESZ)
- {
- fseek(fp,SYMESZ, 1);
- slen = symbol_table[j++].n_length;
- fread(p,slen,1,fp);
- *((p)+slen) = '\0';
- dprintf( p %s , p);
- dprintf( slen %d,slen);
-
- p += slen + 1;
- }
- return (ans);
- }
-